package trans.servlet;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.google.api.translate.Language;

import trans.define.Const;
import trans.define.ErrorMessage;
import trans.util.TranslateUtil;
import twitter4j.Status;
import twitter4j.Twitter;
import twitter4j.TwitterException;

public class EnjatterServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	public void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws IOException {

		// エラーメッセージ保持用リスト
		final List<String> errorList = new ArrayList<String>();

		final List<String> replyList = new ArrayList<String>();

		Twitter twitter = new Twitter(Const.USER_ID, Const.PASSWORD);
		List<Status> list = null;
		try {
			list = twitter.getMentions();
		} catch (TwitterException e) {
			/* 当bot宛へのつぶやきを取得する際にエラーが発生しました。 */
			errorList.add(ErrorMessage.GET_MENTION_ERROR);
		}

		if (list != null && list.size() > 0) {

			// bot宛へのつぶやき @userId
			String toBot = "@" + Const.USER_ID;

			for (Status status : list) {
				// つぶやかれた内容
				String text = status.getText();
				// つぶやかれた時間
				Date date = status.getCreatedAt();
				// つぶやかれたユーザ名
				String userName = status.getUser().getScreenName();
				// 現在時刻
				long now = new Date().getTime();
				// 一定時間以内にbot宛につぶやきがあった場合に処理する
				if (now - date.getTime() <= Const.PREVIOUS_SECONDS_FROM_NOW
						* Const.MILLI_SECONDS
						&& text.startsWith(toBot)) {

					String translatedText = null;
					// bot宛てにつぶやかれたメッセージ内容
					String textTwittered = text.replaceAll(toBot, "").trim();
					// バイト数
					byte[] textByte = textTwittered.getBytes("SJIS");

					try {
						// つぶやきが英語の場合
						if (textByte.length == textTwittered.length()) {
							translatedText = TranslateUtil.translate(
									textTwittered,
									Language.ENGLISH,
									Language.JAPANESE);
						}
						// つぶやきが日本語の場合
						else {
							translatedText = TranslateUtil.translate(
									textTwittered,
									Language.JAPANESE,
									Language.ENGLISH);
						}
					} catch (Exception e) {
						/* 翻訳処理の際にエラーが発生しました。 */
						errorList.add(userName + " : "
								+ ErrorMessage.TLANSLATE_ERROR);
						continue;
					}

					try {
						// つぶやいてきたユーザ宛に返す
						twitter.updateStatus("@"
								+ status.getUser().getScreenName() + " "
								+ translatedText, status.getId());
					} catch (TwitterException e) {
						/* ステータス更新の際にエラーが発生しました。 */
						errorList.add(userName + " : "
								+ ErrorMessage.UPDATE_STATUS_ERROR);
						continue;
					}
					replyList.add(translatedText);
				}
			}
		}

		if (replyList.size() == 0) {
			replyList.add(Const.NO_RESULT_MESSAGE);
		}

		req.setAttribute("list", replyList);

		if (errorList.size() > 0) {
			req.setAttribute("errorList", errorList);
		}

		RequestDispatcher rd = req
				.getRequestDispatcher(Const.FORWARD_RESULT_PAGE);
		try {
			rd.forward(req, resp);
		} catch (Exception e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		}
	}
}
